package dao.hibernate;

import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import service.configuration.IBlockConfig;
import service.configuration.IConfiguration;
import service.configuration.IFieldConfig;
import service.configuration.ISheetConfig;
import service.configuration.NamingUtil;
import service.configuration.xstream.PersonSheetConfig;
import entities.PersonSheet;
import entities.Sheet;

@Service
public class SheetFactory {
	@Resource
	IConfiguration config;
	
	public Sheet createSheet(Map<String, Object> properties) {
		Sheet sheet = null;
		if(properties.get(NamingUtil.TYPE).equals(config.getPersonType())) {
			sheet = new PersonSheet();
		} else {
			sheet = new Sheet();
		}
		
		sheet.setProperties(properties);
		
		return sheet;
	}
	
	
	public static Sheet createSheet(ISheetConfig sheetConfig) {
		Sheet sheet = null;
		if(sheetConfig instanceof PersonSheetConfig) {
			sheet = new PersonSheet();
			((PersonSheet) sheet).setPassword("password");
		} else {
			sheet = new Sheet();
		}
		
		return sheet;
	}
	
	
	/**
	 * Génère une fiche du type correspondant à la configuration passée en argument
	 * contenant pour toutes les propriétés le nom de la colonne correspondante
	 * et pour le code et le type les valeurs passées en argument.
	 * 
	 * @param	sheetConfig 	la configuration du type de fiche à générer
	 * @param	code 			le code affecté à la fiche générée
	 * @param	type			le type affecté à la fiche générée
	 * @return	la fiche générée
	 */
	public static Sheet createSampleSheet(ISheetConfig sheetConfig, String code, String type) {
		if(sheetConfig == null) {
			return null;
		}
		
		Sheet sheet = createSheet(sheetConfig);
		
		sheet.setProperty(NamingUtil.CODE, code);
		sheet.setProperty(NamingUtil.TYPE, type);
		
		for(IBlockConfig blockConfig : sheetConfig.getBlockConfigs()) {
			for(IFieldConfig fieldConfig : blockConfig.getFieldConfigs()) {
				sheet.setProperty(fieldConfig.getName(), fieldConfig.getName());
			}
		}

		return sheet;
	}
	
	
	
	/**
	 * Génère une fiche du type correspondant à la configuration passée en argument
	 * contenant pour toutes les propriétés le nom de la colonne correspondante
	 * et pour le type le nom du type de la configuration passée en argument.
	 * 
	 * @param	sheetConfig 	la configuration du type de fiche à générer
	 * @param	code 			le code affecté à la fiche générée
	 * @param	type			le type affecté à la fiche générée
	 * @return	la fiche générée
	 */
	public static Sheet createSampleSheet(ISheetConfig sheetConfig) {
		return createSampleSheet(sheetConfig,
								 sheetConfig.getCode(),
								 sheetConfig.getName());
	}

}
